class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int ans = Integer.MAX_VALUE;
        int[] sums = new int[n + 1]; 
        // 为了方便计算，令 size = n + 1 
        // sums[0] = 0 意味着前 0 个元素的前缀和为 0
        // sums[1] = A[0] 前 1 个元素的前缀和为 A[0]
        // 以此类推
        for (int i = 1; i <= n; i++) {
            sums[i] = sums[i - 1] + nums[i - 1];
        }
        for (int i = 1; i <= n; i++) {
            int target = s + sums[i - 1];
            //Arrays.binarySearch()可以使用二分搜索法来搜索指定的数组，以获得指定对象。该方法返回要搜索元素的索引值。
            /**
            这个负数返回值将是一个 -(insertionPoint) - 1 的形式，
            其中insertionPoint是将目标值插入数组时的索引位置。
            也就是说，如果插入目标值target到数组sums的适当位置，
            应该放在索引insertionPoint处，那么返回的负数值就是-insertionPoint - 1。
             */
            int bound = Arrays.binarySearch(sums, target);//在sums数组中找target，有返回下标
            if (bound < 0) {
                bound = -bound - 1;
            }
            if (bound <= n) {
                ans = Math.min(ans, bound - (i - 1));
            }
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;

        /**
        超过时间限制
        int cum = Integer.MAX_VALUE;
        for(int i = 0;i < nums.length;i++) {
            int num = 0;
            for(int j = i;j < nums.length;j++) {
                num += nums[j];
                if(num >= target) {
                    cum = Math.min((j-i+1),cum);
                }
            }
        }
        return cum == Integer.MAX_VALUE ? 0:cum;
         */
    }
}